#import <UIKit/UIKit.h>

// 定义震动反馈类型的枚举
// VibrationFeedbackType 枚举定义了不同类型的震动反馈，可用于在应用中触发不同强度和类型的震动。
typedef NS_ENUM(NSInteger, VibrationFeedbackType) {
    // 轻量级震动反馈，通常用于微妙的交互，如轻微的按钮点击。
    VibrationFeedbackTypeLight,
    // 中等强度的震动反馈，适用于一般的交互反馈，如普通按钮点击。
    VibrationFeedbackTypeMedium,
    // 重量级震动反馈，用于更强烈的交互，如重要操作的确认。
    VibrationFeedbackTypeHeavy,
    // 柔和的震动反馈，iOS 13.0 及以上版本支持，提供更柔和的触觉体验。
    VibrationFeedbackTypeSoft,
    // 刚性的震动反馈，iOS 13.0 及以上版本支持，提供更硬朗的触觉体验。
    VibrationFeedbackTypeRigid,
    // 成功操作的震动反馈，通常在任务成功完成时使用。
    VibrationFeedbackTypeSuccess,
    // 警告操作的震动反馈，用于提示用户可能存在的问题。
    VibrationFeedbackTypeWarning,
    // 错误操作的震动反馈，在操作失败时使用，提醒用户操作未成功。
    VibrationFeedbackTypeError
};

/**
 * @brief 供Unity调用的震动反馈函数
 * 
 * 根据传入的反馈类型触发相应的震动反馈。
 * 
 * @param feedbackType 震动反馈的类型，对应 VibrationFeedbackType 枚举中的值。
 */
extern "C" void TriggerVibration_IOS(int feedbackType) {
    switch (feedbackType) {
        case VibrationFeedbackTypeLight: {
            // 创建轻量级震动反馈生成器并初始化
            UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleLight];
            // 准备反馈生成器，提高反馈的响应速度
            [generator prepare];
            // 触发轻量级震动反馈
            [generator impactOccurred];
            break;
        }
        case VibrationFeedbackTypeMedium: {
            // 创建中等强度震动反馈生成器并初始化
            UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleMedium];
            // 准备反馈生成器，提高反馈的响应速度
            [generator prepare];
            // 触发中等强度震动反馈
            [generator impactOccurred];
            break;
        }
        case VibrationFeedbackTypeHeavy: {
            // 创建重量级震动反馈生成器并初始化
            UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleHeavy];
            // 准备反馈生成器，提高反馈的响应速度
            [generator prepare];
            // 触发重量级震动反馈
            [generator impactOccurred];
            break;
        }
        case VibrationFeedbackTypeSoft: {
            // 检查系统版本是否支持柔和震动反馈
            if (@available(iOS 13.0, *)) {
                // 创建柔和震动反馈生成器并初始化
                UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleSoft];
                // 准备反馈生成器，提高反馈的响应速度
                [generator prepare];
                // 触发柔和震动反馈
                [generator impactOccurred];
            }
            break;
        }
        case VibrationFeedbackTypeRigid: {
            // 检查系统版本是否支持刚性震动反馈
            if (@available(iOS 13.0, *)) {
                // 创建刚性震动反馈生成器并初始化
                UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleRigid];
                // 准备反馈生成器，提高反馈的响应速度
                [generator prepare];
                // 触发刚性震动反馈
                [generator impactOccurred];
            }
            break;
        }
        case VibrationFeedbackTypeSuccess: {
            // 创建成功通知反馈生成器并初始化
            UINotificationFeedbackGenerator *generator = [[UINotificationFeedbackGenerator alloc] init];
            // 准备反馈生成器，提高反馈的响应速度
            [generator prepare];
            // 触发成功操作的震动反馈
            [generator notificationOccurred:UINotificationFeedbackTypeSuccess];
            break;
        }
        case VibrationFeedbackTypeWarning: {
            // 创建警告通知反馈生成器并初始化
            UINotificationFeedbackGenerator *generator = [[UINotificationFeedbackGenerator alloc] init];
            // 准备反馈生成器，提高反馈的响应速度
            [generator prepare];
            // 触发警告操作的震动反馈
            [generator notificationOccurred:UINotificationFeedbackTypeWarning];
            break;
        }
        case VibrationFeedbackTypeError: {
            // 创建错误通知反馈生成器并初始化
            UINotificationFeedbackGenerator *generator = [[UINotificationFeedbackGenerator alloc] init];
            // 准备反馈生成器，提高反馈的响应速度
            [generator prepare];
            // 触发错误操作的震动反馈
            [generator notificationOccurred:UINotificationFeedbackTypeError];
            break;
        }
        default:
            break;
    }
}